package com.sgb.kjwl.view.ui.fragment.manage.special

import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.text.TextUtils
import android.text.style.ForegroundColorSpan
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.scwang.smart.refresh.layout.api.RefreshLayout
import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
import com.scwang.smart.refresh.layout.listener.ScrollBoundaryDecider
import com.sgb.kjwl.AppLazyFragment
import com.sgb.kjwl.R
import com.sgb.kjwl.databinding.FragmentSpecialMemberBinding
import com.sgb.kjwl.databinding.ItemInviteMemberBinding
import com.sgb.kjwl.di.self.DaggerSelfFragComponent
import com.sgb.kjwl.di.self.SelfFragModule
import com.sgb.kjwl.model.entity.manage.special.CompanyEntity
import com.sgb.kjwl.model.entity.manage.special.SpecialMemberEntity
import com.sgb.kjwl.view.ui.activity.manage.special.InviteMemberPostActivity
import com.sgb.kjwl.viewmodel.manage.CompanySpecialViewModel
import com.swgk.core.base.di.AppComponent
import com.swgk.core.recyclerview.decoration.RecyclerCustomDecoration
import com.swgk.core.util.DateUtils
import javax.inject.Inject

class InviteMemberFragment : AppLazyFragment() {

    @Inject
    lateinit var  mViewModel : CompanySpecialViewModel
    private var mNo : String = ""

    private var isLoadMore = false //是否加载更多
    private var isEnableLoadMore = false//是否能加载更多

    private lateinit var mBinding : FragmentSpecialMemberBinding

    private lateinit var mAdapter : InviteMemberAdapter

    companion object{
        const val TAG = "specialMemberFragment"
        const val KEY_NO = "key_no"
        fun newInstance(no : String)  : InviteMemberFragment {
            val fragment = InviteMemberFragment()
            val bundle = Bundle()
            bundle.putString(KEY_NO, no)
            fragment.arguments = bundle
            return fragment
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (arguments != null){
            mNo = requireArguments().getString(KEY_NO)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_special_member, container, false)
        return mBinding.root
    }



    override fun setupFragmentComponent(appComponent: AppComponent?) {
        super.setupFragmentComponent(appComponent)
        DaggerSelfFragComponent.builder().appComponent(appComponent)
            .selfFragModule(SelfFragModule()).build().inject(this)
    }

    override fun initView() {
        super.initView()
        initRecyclerView()
        mViewModel.mInviteMemberList.observe(this, {
            isEnableLoadMore = it != null && it.size >= 10
            if (it != null){
                if(isLoadMore){
                    mAdapter.addData(it)
                } else {
                    mAdapter.setNewData(it)
                }
            }
        })
    }

    public fun refresh() {
        isLoadMore = false
        getData()
    }



    override fun onLazyLoad() {
        isLoadMore = false
        getData()
    }


    @SuppressLint("UseRequireInsteadOfGet")
    private fun initRecyclerView() {
        // SwipeRefreshLayout 刷新
        mBinding.refreshLayout.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
            override fun onLoadMore(refreshLayout: RefreshLayout) {
                isLoadMore = true
                getData()
                mBinding.refreshLayout.finishLoadMore(500)
            }

            override fun onRefresh(refreshLayout: RefreshLayout) {
                isLoadMore = false
                getData()
                mBinding.refreshLayout.finishRefresh(500)
            }
        })
        //解决 在实现 上拉加载更多 和 下拉刷新 时  遇到item不在顶端就执行了刷新的方法和数据item没有填满屏幕也执行了加载更多
        mBinding.refreshLayout.setScrollBoundaryDecider(object : ScrollBoundaryDecider {
            override fun canRefresh(content: View): Boolean {
                if (mBinding.recycleView == null) return false
                return mBinding.recycleView.computeVerticalScrollOffset() === 0
            }

            override fun canLoadMore(content: View): Boolean {
                if (mBinding.recycleView == null) return false
                //整个View控件的高度
                val scrollRange: Int = mBinding.recycleView.computeVerticalScrollRange()
                //当前屏幕之前滑过的距离
                val scrollOffset: Int = mBinding.recycleView.computeVerticalScrollOffset()
                //当前屏幕显示的区域高度
                val scrollExtent: Int = mBinding.recycleView.computeVerticalScrollExtent()
                //获取recyclerView的高度
                val height: Int = mBinding.recycleView.height
                if (height > scrollRange) {
                    return false
                }
                return isEnableLoadMore && scrollRange <= scrollOffset + scrollExtent
            }
        })
        mBinding.recycleView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
        mBinding.recycleView.setItemViewCacheSize(100)
        mBinding.recycleView.setHasFixedSize(true)
        mAdapter = InviteMemberAdapter(context!!, R.layout.item_invite_member)
        mAdapter.bindToRecyclerView(mBinding.recycleView)
        val empty = LayoutInflater.from(context).inflate(R.layout.layout_empty_view, mBinding.recycleView, false)
        mAdapter.emptyView = empty
        mBinding.recycleView.addItemDecoration(
            RecyclerCustomDecoration(
                0f,
                0f,
                0f,
                resources.getDimension(R.dimen.dp10), resources.getColor(R.color.color_main_bg)
            )
        )
        mAdapter.setOnItemClickListener { adapter, view, position ->
            if (mAdapter.getItem(position) != null){
                mViewModel.getDetail(activity!!, "" + mAdapter.getItem(position)!!.no, "邀请详情")
            }
        }
    }

    private fun getData() {
       mViewModel.getInviteMemberList(if (mNo == "-1") "" else mNo, isLoadMore);
    }


    class InviteMemberAdapter(mContext : Context, layoutResId : Int) : BaseQuickAdapter<SpecialMemberEntity, BaseViewHolder>(layoutResId){
        private  var mItemBinging : ItemInviteMemberBinding ?= null

        private var mColorSpan : ForegroundColorSpan = ForegroundColorSpan(mContext.resources.getColor(R.color.color_title_medium))

        private var ssb : SpannableStringBuilder ?= null

        override fun convert(helper: BaseViewHolder?, item: SpecialMemberEntity?) {
            mItemBinging = DataBindingUtil.bind(helper!!.itemView)
            if (mItemBinging != null){
                mItemBinging!!.tvName.text = item!!.companyName
                setColorSpan(mContext.resources.getString(R.string.invite_business_address, if (TextUtils.isEmpty(item!!.address)) "" else item.address), mItemBinging!!.tvBusinessAddress)
                setColorSpan(mContext.resources.getString(R.string.invite_business_operation, if (TextUtils.isEmpty(item.business)) "" else item.business), mItemBinging!!.tvBusinessOperation)
                setColorSpan(mContext.resources.getString(R.string.invite_time, if (item.createTime == 0L) "" else DateUtils.timestampToDateSecond(item.createTime)), mItemBinging!!.tvTime)
                mItemBinging!!.llAgain.visibility = if(item.status == 2 && !item.isAgain()) View.VISIBLE else View.GONE
                mItemBinging!!.tvAgain.setOnClickListener {
                    val entity = CompanyEntity().apply {
                        this.businessAddress = item.address
                        this.mainBusiness = item.business
                        this.concat = item.contacts
                        this.contactNumber = item.phone
                        this.companyNo = item.companyNo
                        this.companyName = item.companyName
                    }
                    InviteMemberPostActivity.launch(mContext, entity, false)
                }
                //0待受理 1已同意 2已拒绝
                if (item.status == 0){
                    mItemBinging!!.tvStatus.text = "待受理"
                    mItemBinging!!.tvStatus.setBgColor(R.color.color_secondary_yellow)
                } else if (item.status == 1){
                    mItemBinging!!.tvStatus.text = "已通过"
                    mItemBinging!!.tvStatus.setBgColor(R.color.color_secondary_green)
                } else if (item.status == 2){
                    mItemBinging!!.tvStatus.text = "已拒绝"
                    mItemBinging!!.tvStatus.setBgColor(R.color.color_secondary_red)
                }
            }
        }

        private fun setColorSpan(content: String, tv: TextView) {
            ssb = SpannableStringBuilder(content)
            ssb!!.setSpan(mColorSpan, content.indexOf("："), content.length, Spannable.SPAN_EXCLUSIVE_INCLUSIVE)
            tv.text = ssb
        }

    }
}